package control;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import entity.Atividade;
import entity.Execucao;
import entity.Iteracao;
import entity.Periodo;
import entity.StatusAtividade;

import service.ProjetoService;
import util.UsuarioLogado;

@Named
@SessionScoped
public class RegistrarExecucaoControl implements Serializable {
	private static final long serialVersionUID = 6363860579462673892L;

	@Inject
	private UsuarioLogado usuario;
	
	@Inject
	private MenuControl menu;
	
	@EJB
	private ProjetoService projetoService;
	
	private List<Atividade> atividades;
	
	private Long idAtividadeSelecionada;
	private Atividade atividade;
	private Iteracao iteracao;
	private Boolean desabilitarOperacoes;
	private Boolean mostrarDetalhesIteracao;
	
	// dados execucao
	private Long idExecucaoSelecionada;
	private Date inicio;
	private Date fim;
	private String descricao;
	private Integer qtdHoras;
	
	private static final String OP_INCLUIR = "I";
	private static final String OP_ALTERAR = "A";
	private String operacao;
	
	public String iniciar() {
		iteracao = projetoService.obterIteracaoEmAndamento(menu.getIdProjetoSelecionado());
		atividades = projetoService.listarAtividadesDoRecurso(usuario.getRecursoLogado().getIdRecurso(), menu.getIdProjetoSelecionado());
		if (iteracao == null) {
			FacesContext.getCurrentInstance().addMessage(null, 
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Projeto não possui iteração Em Andamento.", ""));
		}		
		mostrarDetalhesIteracao = iteracao != null;
		return "/pages/projeto/registrar_execucao_lista_atividades";
	}

	public String obterAtividade() {
		atividade = projetoService.obterAtividadeComExecucoes(idAtividadeSelecionada);
		desabilitarOperacoes = !atividade.getStatus().equals(StatusAtividade.EXECUCAO);
		
		return "/pages/projeto/registrar_execucao_detalhe_atividade";
	}
	
	public String novaExecucao() {
		operacao = OP_INCLUIR;
		inicio = atividade.getInicioEstimado();
		fim = atividade.getInicioEstimado();
		descricao = null;
		qtdHoras = null;
		
		return "";
	}
	
	public String salvarExecucao() {
		if (OP_INCLUIR.equals(operacao)) {
			projetoService.adicionarExecucaoAAtividade(idAtividadeSelecionada, new Periodo(inicio, fim), qtdHoras, descricao);			
		} else if (OP_ALTERAR.equals(operacao)) {
			projetoService.alterarExecucao(idExecucaoSelecionada, new Periodo(inicio, fim), qtdHoras, descricao);
		}
		atividade = projetoService.obterAtividadeComExecucoes(idAtividadeSelecionada);
		
		return "";
	}
	
	public String editarExecucao() {
		operacao = OP_ALTERAR;
		Execucao execucao = projetoService.obterExecucao(idExecucaoSelecionada);
		inicio = execucao.getInicio();
		fim =  execucao.getFim();
		descricao = execucao.getDescricao();
		qtdHoras = execucao.getQtdHoras();
		
		return "";
	}
	
	public String excluirExecucao()	{
		projetoService.excluirExecucao(idExecucaoSelecionada);
		atividade = projetoService.obterAtividadeComExecucoes(idAtividadeSelecionada);
		
		return "";
	}
	
	public String concluirAtividade() {
		projetoService.concluirAtividade(idAtividadeSelecionada);
		
		return iniciar();
	}
	
	
	public List<Atividade> getAtividades() {
		return atividades;
	}

	public Atividade getAtividade() {
		return atividade;
	}

	public Long getIdAtividadeSelecionada() {
		return idAtividadeSelecionada;
	}

	public void setIdAtividadeSelecionada(Long idAtividadeSelecionada) {
		this.idAtividadeSelecionada = idAtividadeSelecionada;
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getFim() {
		return fim;
	}

	public void setFim(Date fim) {
		this.fim = fim;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Integer getQtdHoras() {
		return qtdHoras;
	}

	public void setQtdHoras(Integer qtdHoras) {
		this.qtdHoras = qtdHoras;
	}

	public Long getIdExecucaoSelecionada() {
		return idExecucaoSelecionada;
	}

	public void setIdExecucaoSelecionada(Long idExecucaoSelecionada) {
		this.idExecucaoSelecionada = idExecucaoSelecionada;
	}

	public Iteracao getIteracao() {
		return iteracao;
	}

	public Boolean getDesabilitarOperacoes() {
		return desabilitarOperacoes;
	}

	public Boolean getMostrarDetalhesIteracao() {
		return mostrarDetalhesIteracao;
	}
}
